/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package fr.uniscol.admin;

import fr.uniscol.UniscolMainController;
import fr.uniscol.editors.CustomGregorianCalendarPropertyEditor;
import fr.uniscol.editors.EtablissementPropertyEditor;
import fr.uniscol.editors.UtilisateurPropertyEditor;
import fr.uniscol.model.BaseAnneeScolaire;
import fr.uniscol.model.DefaultUser;
import fr.uniscol.model.EtablissementModel;
import fr.uniscol.model.parsers.EtablissementModelParser;
import fr.uniscol.service.IAdminBasesService;
import fr.uniscol.service.IEtablissementService;
import fr.uniscol.service.IUtilisateurService;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

/**
 *
 * @author Christophe
 */
@Controller
public class AdminBaseCreatorController extends UniscolMainController {
    
    @Autowired
    private IAdminBasesService adminBasesService;
    
    @Autowired
    private IEtablissementService etablissementService;
    
    @Autowired
    private IUtilisateurService utilisateurService;
    
    @ModelAttribute("bases")
    public List<BaseAnneeScolaire> getAllBases(){
        return adminBasesService.getAllBases();
    }
    
    @ModelAttribute("etablissements")
    public List<EtablissementModel> getAllEtablissements(){
        return etablissementService.getAllEtablissements();
    }
    
    @ModelAttribute("utilisateurs")
    public List<DefaultUser> getUtilisateurs(){
        return utilisateurService.getAllUtilisateurs();
    }
    
    @InitBinder
    public void initBinder(WebDataBinder binder){
        binder.registerCustomEditor(GregorianCalendar.class, new CustomGregorianCalendarPropertyEditor(new SimpleDateFormat("dd/MM/yyyy")));
        binder.registerCustomEditor(EtablissementModel.class, new EtablissementPropertyEditor(etablissementService));
        binder.registerCustomEditor(DefaultUser.class, new UtilisateurPropertyEditor(utilisateurService));
    }
    
    @RequestMapping("/admin/bases")
    public String listBases(HttpSession session, Model model){
        return "administration/bases";
    }
    
    @RequestMapping("/admin/base.create")
    public ModelAndView createNewBase(Model model){
        
        BaseAnneeScolaire base = new BaseAnneeScolaire();
        
        DefaultUser admin = new DefaultUser();
        admin.setLogin("admin");
        
        model.addAttribute("admin", admin);
        /*
        FormulaireMultiple form = new FormulaireMultiple();
        EtapeFormulaire etapeBaseInfos = new EtapeFormulaire();
        
        EtapeFormulaire etapeChoixEtablissement = new EtapeFormulaire();
        EtapeFormulaire etapeSelectionUtilisateurs = new EtapeFormulaire();
            
        form.getEtapes().add(etapeBaseInfos);
        form.getEtapes().add(etapeChoixEtablissement);
        form.getEtapes().add(etapeSelectionUtilisateurs);
        */
        
        return new ModelAndView("administration/base", "base", base);
    }
    
    @RequestMapping("/admin/base.edit")
    public ModelAndView editBase(@RequestParam("baseid") long baseId, HttpSession session){
        
        BaseAnneeScolaire base = adminBasesService.getBaseById(baseId);
        
        return new ModelAndView("administration/base", "base", base);
    }
    
    @RequestMapping(value = "/admin/base.save", method = RequestMethod.POST)
    public String saveBase(@ModelAttribute("base") BaseAnneeScolaire base, 
                          BindingResult results,
                          HttpSession session){
        
        /*EtablissementModel etablissement = new EtablissementModelParser().parseFromRequest(req);
        base.setEtablissement(etablissement);-*/
        log.debug("ETB.UAI:" + (base.getEtablissement() != null ? base.getEtablissement().getUai() : "(NULL)"));
        log.debug("ETB.NOM:" + (base.getEtablissement() != null ? base.getEtablissement().getNom() : "(NULL)"));
        
        log.debug("ADMIN.ID:" + (base.getAdministrateur() != null ? base.getAdministrateur().getId() : "(NULL)"));
        log.debug("ADMIN.NOM:" + (base.getAdministrateur() != null ? base.getAdministrateur().getIdentite() : "(NULL)"));
        log.debug("ADMIN.LOGIN:" + (base.getAdministrateur() != null ? base.getAdministrateur().getLogin() : "(NULL)"));
        log.debug("ADMIN.PASSWORD:" + (base.getAdministrateur() != null ? base.getAdministrateur().getPassword() : "(NULL)"));
        
        if(base.getAdministrateur() != null){
            base.getAdministrateur().setBaseSelectionnee(base);
        }
        
        if(adminBasesService.saveBase(base)){
            alertSuccess("base.save.ok", "La base a été enregistrée avec succès", session);
        }else{
            alertError("base.save.nok", "La base n'a pas été enregistrée", session);
        }
        
        return "redirect:bases";
    }
    
    @RequestMapping("/admin/base.delete")
    public String deleteBase(@RequestParam("baseid") long baseId, HttpSession session){
        
        BaseAnneeScolaire base = adminBasesService.getBaseById(baseId);
        
        if(adminBasesService.deleteBase(base)){
            alertSuccess("base.delete.ok", "La base a été supprimée avec succès", session);
        }else{
            alertError("base.delete.ok", "La base n'a pas été supprimée", session);
        }
        
        return "redirect:bases";
    }
}
